Produits tiers

Formation - Ewon - 01/2022

Applicatif ET 200SP

Le dialogue entre l’automate ET 200SP et le modem Flexy 205 se fait également en Modbus - TCP.
Une séquence de communication entre le modem et l’eWON a été développée pour l’échange des registres.
Une séquence de lecture/écriture des SMS reprend quasiment à l’identique le code du M340 .

Important : cet exemple a été développé avec la première version du programme de l’eWON.Donc les registres Modbus seront à adapter avec la nouvelle table Modbus.

6.1 Gestion de l’échange des registres

6.1.1 Configuration de l’eWON

La configuration de l’eWON est identique à celle décrite dans la partie M340.
Dans Flexy 205 :

Configuration eWON

Figure 52 : Configuration eWON

  1. Clic 🏠 > Tags > Serveur d'E/S > Général > Configurations globales .

Port Modbus TCP: 502
Port Ethernet/IP: 44818Port ISOTCP: 102
Port FINS: 9600
Temps de réponse TCP RX/TX par défaut: 1000 MSec

6.1.2 Configuration de l’ET 200 SP

Configuration IP de l’ET 200 SP

Figure 53 : Configuration IP de l’ET 200 SP

◉ Définir l'adresse IP dans le projet
Adresse IP : 200.200.200.43
Masque ss. rés. : 255. 255.255.0

ID matériel

Figure 54 : ID matériel

  1. Déclaration de l’adresse IP dans la même plage réseau que le modem eWON ;
  2. ID matériel : 64. Pensez à noter l’ID matériel pour la fonction de communication Modbus.

6.1.3 Programme eWON

Le programme de l’eWON est identique à celui décrit dans la partie M340.

6.1.4 DB FC 211 COM Modbus eWON

Création du DB211_COM_EWON pour :

  1. La séquence de communication Modbus : G7_SEQ de type UDT_SEQ ;
  2. Les paramètres de gestion de la communication : GEST_COM de type UDT_Modbus ;
  3. La table d’échange des Tags eWON avec l’automate : reprise individuelle chaque tag.
DB211_COM_EWON

Figure 55 : DB211_COM_EWON

Création du FC211_SEQ_MODBUS_EWON pour la mise en œuvre de la communication Modbus-TCP avec l’eWON :
Appel du FC dans OB1.
Initialisation classique de la séquence :

//INIT SEQUENCE PAR AFFICHEUR
IF "AlwaysFALSE" THEN
"DB211_COM_EWON".G7_SEQ.NUM_ETAPE := 0;
END_IF;

//RAZ DES VARIABLES
IF "DB211_COM_EWON".G7_SEQ.NUM_ETAPE = 0 THEN
...
END_IF;

//DEMARRAGE DE LA SEQUENCE
IF "DB211_COM_EWON".G7_SEQ.NUM_ETAPE = 0 AND "REPRISE_API_OK" THEN
"DB211_COM_EWON".G7_SEQ.NUM_ETAPE := 10;
END_IF;

//INCREMENTATION TEMPO
IF "BIT_100ms" AND "DB211_COM_EWON".G7_SEQ.T_100MS < 32766 THEN
"DB211_COM_EWON".G7_SEQ.T_100MS := "DB211_COM_EWON".G7_SEQ.T_100MS + 1;
END_IF;
IF "BIT_1s" AND "DB211_COM_EWON".G7_SEQ.T_1S < 32766 THEN
"DB211_COM_EWON".G7_SEQ.T_1S := "DB211_COM_EWON".G7_SEQ.T_1S + 1;
END_IF;

//GESTION DU MOT DE VIE
IF "BIT_1s" THEN
IF "DB211_COM_EWON".MOT_VIE < 32000 THEN
"DB211_COM_EWON".MOT_VIE := "DB211_COM_EWON".MOT_VIE + 1;
ELSE
"DB211_COM_EWON".MOT_VIE := 0;
END_IF;
END_IF;

  1. Init par afficheur. Ajouter BP ;
  2. RAZ des variables.

Appel asynchrone de la fonction de communication : MB_CLIENT de type FB avec son DB d’instance automatique MB_CLIENT_DB [DB1].

//appel asynchrone de la fonction de communication
"MB_CLIENT_DB"(REQ:="DB211_COM_EWON".G7_SEQ.CMD1_0,
DISCONNECT:="DB211_COM_EWON".G7_SEQ.CMD1_2,
MB_MODE:="DB211_COM_EWON".GEST_COM.Mode,
MB_DATA_ADDR:="DB211_COM_EWON".GEST_COM.Adr_data,
MB_DATA_LEN:="DB211_COM_EWON".GEST_COM.Longueur_data,
DONE=>"DB211_COM_EWON".GEST_COM.Done,
BUSY=>"DB211_COM_EWON".GEST_COM.Busy,
ERROR=>"DB211_COM_EWON".GEST_COM.Error,
STATUS=>"DB211_COM_EWON".GEST_COM.Status,
MB_DATA_PTR:="DB211_COM_EWON".GEST_COM.Tab_data,
CONNECT:="DB211_COM_EWON".GEST_COM.Param_com );

//--------------------------------------------------------------------

  1. Le bit de séquence CMD1_0 lance la requête de com en lecture ou écriture ;
  2. Le bit de séquence CMD1_2 connecte la com ;
  3. Les bits Done, Busy et Error contrôle le déroulement de la communication ;
  4. Le mot STATUS renvoi le code d’erreur ;
  5. Le tableau d’entier Tab_data sert aux échanges des données en lecture ou écriture.

Param_com est de type TCON_IP_v4 et contient la définition de la com.

Étape 10 = initialisation des paramètres de communication

//ETAPE DE PREPARATION COM AU DEMARRAGE
IF "DB211_COM_EWON".G7_SEQ.NUM_ETAPE = 10 THEN
//------ Preparation des paramètres de com
//ID matérielle de l'interface locale cf config matérielle
"DB211_COM_EWON".GEST_COM.Param_com.InterfaceId := 64;
//Paramètre permettant d'identifier sans équivoque une connexion au sein de la CPU
// Pour chacune des instances de l'instruction "MB_CLIENT", // une ID univoque doit être spécifiée.
"DB211_COM_EWON".GEST_COM.Param_com.ID:=1;
//Type de liaison: Sélectionnez 11 (décimal) pour TCP
"DB211_COM_EWON".GEST_COM.Param_com.ConnectionType := 11;
//Identificateur pour le type d'établissement de la liaison :
//Sélectionnez TRUE pour l'établissement actif de la liaison.
"DB211_COM_EWON".GEST_COM.Param_com.ActiveEstablished := TRUE;
//Adresse IP du partenaire de liaison
"DB211_COM_EWON".GEST_COM.Param_com.RemoteAddress.ADDR[1] := 200;
"DB211_COM_EWON".GEST_COM.Param_com.RemoteAddress.ADDR[2] := 200;
"DB211_COM_EWON".GEST_COM.Param_com.RemoteAddress.ADDR[3] := 200;
"DB211_COM_EWON".GEST_COM.Param_com.RemoteAddress.ADDR[4] := 37;
//Numéro de port du partenaire de liaison distant
//valeur par défaut : 502 pour Modbus TCP
"DB211_COM_EWON".GEST_COM.Param_com.RemotePort := 502;
//Numéro de port du partenaire de liaison local :
"DB211_COM_EWON".GEST_COM.Param_com.LocalPort := 1;

//numero d'esclave ewon =10 (par defaut siemens 255)
"MB_CLIENT_DB".MB_Unit_ID := 10;

"DB211_COM_EWON".G7_SEQ.T_1S := 0;
"DB211_COM_EWON".G7_SEQ.T_100MS := 0;
"DB211_COM_EWON".G7_SEQ.NUM_ETAPE := 100;

END_IF;

Paramètres de type TCON_IP_v4 à définir

  1. InterfaceId : fait référence à l’ID matériel de la carte Ethernet ;
  2. ID : par défaut à 1, numéro de la liaison créée ;
  3. ConnectionType : à 11 toujours ;
  4. ActiveEstablished : à TRUE toujours pour un client Modbus TCP ;
  5. RemoteAddress : tableau de 4 octets contentant l’adresse IP du partenaire soit ici 200.200.200.37 pour l’eWON ;
  6. RemotePort : à 502 par défaut pour le Modbus TCP ;
  7. LocalPort : à 1, numéro de port du partenaire. Aucun paramètre correspondant dans l’eWON.

Paramètre du DB d’instance du FB MB_client

  • Unit_ID : par défaut ce paramètre est à 16#FF, il faut le mettre à 10 par le faire correspondre au paramètre n° d’équipement Modbus de l’eWON. Cf. Configuration eWON.

Étape 100 = lancement de la lecture des registres d’échange tags eWON 210 à 219

// LECTURE PARTIE 1 : MOT d'ECHANGE
IF "DB211_COM_EWON".G7_SEQ.NUM_ETAPE = 100 AND "DB211_COM_EWON".G7_SEQ.T_100MS>=1 THEN

// LECTURE REGISTRE EWON 210 à 219
"DB211_COM_EWON".GEST_COM.Mode := 0; // lecture
"DB211_COM_EWON".GEST_COM.Adr_data := 40210; // (210-1) pour modbus + 40001
"DB211_COM_EWON".GEST_COM.Longueur_data := 10; // nombre

IF NOT "DB211_COM_EWON".GEST_COM.Busy THEN
"DB211_COM_EWON".G7_SEQ.CMD1_0 := TRUE; // bit de sequence pour lancement com
"DB211_COM_EWON".G7_SEQ.CMD1_2 := FALSE; // bit seq pour forcage deconnexion

"DB211_COM_EWON".G7_SEQ.T_1S := 0;
"DB211_COM_EWON".G7_SEQ.T_100MS := 0;
"DB211_COM_EWON".G7_SEQ.NUM_ETAPE := 110;
END_IF;
END_IF;

Paramètres pour la fonction MB_client :

  1. Mode = 0 pour la lecture ;
  2. Adr_data = (210-1) + 40001 , registre de maintien de l’eWON adresse 210.

On retrouve un décalage de -1 du registre Modbus comme pour le M340

  • Longueur_data = 10, on lit les 10 registres à partir de Adr_data soit 210 à 219.

Vérification avant lancement de la fonction en lecture (bit CMD1_0 = True) que la fonction est libre par contrôle du bit Busy à 0.

Étape 110 = ⌛ attente de la fin de l’échange et enregistrement du résultat

// LECTURE PARTIE 1 : MOT d'ECHANGE
IF "DB211_COM_EWON".G7_SEQ.NUM_ETAPE = 110 THEN

// LECTURE PARTIE 1 : MOT d'ECHANGE
IF "DB211_COM_EWON".G7_SEQ.NUM_ETAPE = 110 THEN

// attente fin de com
IF (NOT "DB211_COM_EWON".GEST_COM.Busy AND "DB211_COM_EWON".GEST_COM.Done)
OR ("DB211_COM_EWON".GEST_COM.Error) THEN
"DB211_COM_EWON".G7_SEQ.CMD1_0 := FALSE; // bit de seq pour lancement com

// pas d'erreur de com
IF NOT "DB211_COM_EWON".GEST_COM.Error THEN
"DB211_COM_EWON".G7_SEQ.CMD2_0 := False; // defaut de com de l'esclave

// traitement des données
"DB211_COM_EWON".STATUS_ENVOI := "DB211_COM_EWON".GEST_COM.Tab_data[0];
"DB211_COM_EWON".STATUS_MESS_RECU := "DB211_COM_EWON".GEST_COM.Tab_data[1];
"DB211_COM_EWON".SIGNAL_GSM := "DB211_COM_EWON".GEST_COM.Tab_data[2];
"DB211_COM_EWON".INT_R4 := "DB211_COM_EWON".GEST_COM.Tab_data[3];
"DB211_COM_EWON".INT_R5 := "DB211_COM_EWON".GEST_COM.Tab_data[4];
"DB211_COM_EWON".INT_R6 := "DB211_COM_EWON".GEST_COM.Tab_data[5];

// vers etape suivante
"DB211_COM_EWON".G7_SEQ.T_100MS := 0;
"DB211_COM_EWON".G7_SEQ.T_1S := 0;
"DB211_COM_EWON".G7_SEQ.NUM_ETAPE := 120;

// erreur de com
ELSE
"DB211_COM_EWON".G7_SEQ.INT_1 := WORD_TO_INT("DB211_COM_EWON".GEST_COM.Status);
"DB211_COM_EWON".G7_SEQ.CMD2_0 := True; // defaut de com de l'esclave
// vers etape suivante
"DB211_COM_EWON".G7_SEQ.T_100MS := 0;
"DB211_COM_EWON".G7_SEQ.T_1S := 0;
"DB211_COM_EWON".G7_SEQ.NUM_ETAPE := 200;
END_IF;
END_IF;
END_IF;

Lorsque la fonction de communication se termine :

  1. Le bit Busy retombe à 0 ;
  2. Le bit Done passe à 1 si la fonction est correcte sur un tour de cycle automate ;
  3. Le bit Error passe à 1 si la fonction renvoi une erreur sur un tour de cycle.

Si la fonction n’a pas renvoyé d’erreur on enregistre les données reçues dans les mots du DB_211correspondant aux registres eWON.

Étape 120 = lancement de la lecture des registres du message SMS reçu par l’eWON.

// LECTURE PARTIE 2 : MESSAGE SMS RECU CARACTERE 1 à 100
IF "DB211_COM_EWON".G7_SEQ.NUM_ETAPE = 120 AND
// attente fin de com
IF (NOT "DB211_COM_EWON".GEST_COM.Busy AND "DB211_COM_EWON".GEST_COM.Done)
OR ("DB211_COM_EWON".GEST_COM.Error) THEN
"DB211_COM_EWON".G7_SEQ.CMD1_0 := FALSE; // bit de seq pour lancement com

// pas d'erreur de com
IF NOT "DB211_COM_EWON".GEST_COM.Error THEN
"DB211_COM_EWON".G7_SEQ.CMD2_0 := False; // defaut de com de l'esclave

// traitement des données
FOR #int_i := 0 TO 99 DO
// Statement section FOR
"DB211_COM_EWON".SMS_RECU[#int_i+1] := "DB211_COM_EWON".GEST_COM.Tab_data[#int_i];
END_FOR;

// vers etape suivante
"DB211_COM_EWON".G7_SEQ.T_100MS := 0;
"DB211_COM_EWON".G7_SEQ.T_1S := 0;
"DB211_COM_EWON".G7_SEQ.NUM_ETAPE := 140;

// erreur de com
ELSE
"DB211_COM_EWON".G7_SEQ.INT_1 := WORD_TO_INT("DB211_COM_EWON".GEST_COM.Status);
"DB211_COM_EWON".G7_SEQ.CMD2_0 := True; // defaut de com de l'esclave
// vers etape suivante
"DB211_COM_EWON".G7_SEQ.T_100MS := 0;
"DB211_COM_EWON".G7_SEQ.T_1S := 0;
"DB211_COM_EWON".G7_SEQ.NUM_ETAPE := 200;
END_IF;
END_IF;

END_IF;

Lecture du début de message registre 1001 à 1100.
Attention : la lecture Modbus est limitée à 123 registres consécutifs donc le message SMS de 160 registres doit être lu en 2 fois.
Paramètres pour la fonction MB_client :

  1. Mode = 0 pour la lecture ;
  2. Adr_data = (1001-1) + 40001 , registre de maintien de l’eWON adresse 1001 ;
  3. Longueur_data = 100, on lit les 100 registres à partir de Adr_data soit 1001 à 1100.

Étape 130 = ⌛ attente de la fin de l’échange et enregistrement du résultat.

// LECTURE PARTIE 2 : MESSAGE SMS RECU CARACTERE 1 à 100
IF "DB211_COM_EWON".G7_SEQ.NUM_ETAPE = 130 THEN

// attente fin de com
IF (NOT "DB211_COM_EWON".GEST_COM.Busy AND "DB211_COM_EWON".GEST_COM.Done)
OR ("DB211_COM_EWON".GEST_COM.Error) THEN
"DB211_COM_EWON".G7_SEQ.CMD1_0 := FALSE; // bit de seq pour lancement com

// pas d'erreur de com
IF NOT "DB211_COM_EWON".GEST_COM.Error THEN
"DB211_COM_EWON".G7_SEQ.CMD2_0 := False; // defaut de com de l'esclave

// traitement des données
FOR #int_i := 0 TO 99 DO
// Statement section FOR
"DB211_COM_EWON".SMS_RECU[#int_i+1] := "DB211_COM_EWON".GEST_COM.Tab_data[#int_i];
END_FOR;

// vers etape suivante
"DB211_COM_EWON".G7_SEQ.T_100MS := 0;
"DB211_COM_EWON".G7_SEQ.T_1S := 0;
"DB211_COM_EWON".G7_SEQ.NUM_ETAPE := 140;

// erreur de com
ELSE
"DB211_COM_EWON".G7_SEQ.INT_1 := WORD_TO_INT("DB211_COM_EWON".GEST_COM.Status);
"DB211_COM_EWON".G7_SEQ.CMD2_0 := True; // defaut de com de l'esclave
// vers etape suivante
"DB211_COM_EWON".G7_SEQ.T_100MS := 0;
"DB211_COM_EWON".G7_SEQ.T_1S := 0;
"DB211_COM_EWON".G7_SEQ.NUM_ETAPE := 200;
END_IF;
END_IF;

END_IF;

Si la fonction n’a pas renvoyé d’erreur on enregistre les données reçues dans le tableau de caractères Char du DB211 correspondant aux registres eWON.
Le passage d’un format int Tab_data à un format Char SMS_recu se fait de manière implicite. Siemens signale juste une perte de précision en soulignant l’instruction en jaune.

Étape 140 = lancement de la lecture des registres du message SMS reçu par l’eWON.

// LECTURE PARTIE 2 : MESSAGE SMS RECU CARACTERE 101 à 160
IF "DB211_COM_EWON".G7_SEQ.NUM_ETAPE = 140 AND "DB211_COM_EWON".G7_SEQ.T_100MS >= 1 THEN

// LECTURE REGISTRE EWON 1101 à 1160
"DB211_COM_EWON".GEST_COM.Mode := 0; // lecture
"DB211_COM_EWON".GEST_COM.Adr_data := 41101; // (1101-1) pour modbus + 40001
"DB211_COM_EWON".GEST_COM.Longueur_data := 60; // nombre

IF NOT "DB211_COM_EWON".GEST_COM.Busy THEN
"DB211_COM_EWON".G7_SEQ.CMD1_0 := TRUE; // bit de seq pour lancement com
"DB211_COM_EWON".G7_SEQ.CMD1_2 := FALSE; // bit seq forcage deconnexion

"DB211_COM_EWON".G7_SEQ.T_1S := 0;
"DB211_COM_EWON".G7_SEQ.T_100MS := 0;
"DB211_COM_EWON".G7_SEQ.NUM_ETAPE := 150;
END_IF;
END_IF;

Lecture de la fin de message registre 1101 à 1160.
Attention : la lecture Modbus est limitée à 123 registres consécutifs donc le message SMS de 160 registres doit être lu en 2 fois.
Paramètres pour la fonction MB_client :

  1. Mode = 0 pour la lecture ;
  2. Adr_data = (1101-1)+40001 , registre de maintien de l’eWON adresse 1101 ;
  3. Longueur_data = 60, on lit les 60 registres à partir de Adr_data soit 1101 à 1160.

Étape 150 = ⌛ attente de la fin de l’échange et enregistrement du résultat.

// LECTURE PARTIE 2 : MESSAGE SMS RECU CARACTERE 101 à 160
IF "DB211_COM_EWON".G7_SEQ.NUM_ETAPE = 150 THEN

// attente fin de com
IF (NOT "DB211_COM_EWON".GEST_COM.Busy AND "DB211_COM_EWON".GEST_COM.Done)
OR ("DB211_COM_EWON".GEST_COM.Error) THEN
"DB211_COM_EWON".G7_SEQ.CMD1_0 := FALSE; // bit de seq pour lancement com

// pas d'erreur de com
IF NOT "DB211_COM_EWON".GEST_COM.Error THEN
"DB211_COM_EWON".G7_SEQ.CMD2_0 := False; // defaut de com de l'esclave

// traitement des données
FOR #int_i := 0 TO 59 DO
// Statement section FOR
"DB211_COM_EWON".SMS_RECU[#int_i + 101] := "DB211_COM_EWON".GEST_COM.Tab_data[#int_i];
END_FOR;

// vers etape suivante
"DB211_COM_EWON".G7_SEQ.T_100MS := 0;
"DB211_COM_EWON".G7_SEQ.T_1S := 0;
"DB211_COM_EWON".G7_SEQ.NUM_ETAPE := 200;

// erreur de com
ELSE
"DB211_COM_EWON".G7_SEQ.INT_1 := WORD_TO_INT("DB211_COM_EWON".GEST_COM.Status);
"DB211_COM_EWON".G7_SEQ.CMD2_0 := True; // defaut de com de l'esclave
// vers etape suivante
"DB211_COM_EWON".G7_SEQ.T_100MS := 0;
"DB211_COM_EWON".G7_SEQ.T_1S := 0;
"DB211_COM_EWON".G7_SEQ.NUM_ETAPE := 200;
END_IF;
END_IF;

END_IF;

Si la fonction n’a pas renvoyé d’erreur, on enregistre les données reçues dans le tableau de caractères Char du DB211 correspondant aux registres eWON.
Le passage d’un format int Tab_data à un format Char SMS_recu se fait de manière implicite. Siemens signale juste une perte de précision en soulignant l’instruction en jaune.

Étape 200 = lancement de l’écriture des registres du message SMS envoyé par l’eWON. Écriture du début de message registre 1 à 100.

// ECRITURE PARTIE 1 : MESSAGE SMS A ENVOYER CARACTERE 1 à 100
IF "DB211_COM_EWON".G7_SEQ.NUM_ETAPE = 200 AND "DB211_COM_EWON".G7_SEQ.T_100MS>=1 THEN

// preparation des données
FOR #int_i := 0 TO 99 DO
// Statement section FOR
"DB211_COM_EWON".GEST_COM.Tab_data[#int_i] := "DB211_COM_EWON".SMS_ENVOI[#int_i+1] ;
END_FOR;

// ECRITURE REGISTRE EWON 1 à 160
"DB211_COM_EWON".GEST_COM.Mode := 1; // ecriture
"DB211_COM_EWON".GEST_COM.Adr_data := 40001; // (1-1) pour modbus + 40001
"DB211_COM_EWON".GEST_COM.Longueur_data := 100; // nombre

IF NOT "DB211_COM_EWON".GEST_COM.Busy THEN
"DB211_COM_EWON".G7_SEQ.CMD1_0 := TRUE; // bit de seq pour lancement com
"DB211_COM_EWON".G7_SEQ.CMD1_2 := FALSE; // bit seq pour forcage deconnexion

"DB211_COM_EWON".G7_SEQ.T_1S := 0;
"DB211_COM_EWON".G7_SEQ.T_100MS := 0;
"DB211_COM_EWON".G7_SEQ.NUM_ETAPE := 210;
END_IF;
END_IF;

Attention : l’écriture Modbus est limitée à 123 registres consécutifs donc le message SMS de 160 registres doit être écrit en 2 fois.
Préparation du message à envoyer, on recopie le tableau de Char SMS_ENVOI dans le tableau de la fonction de communication.
Paramètres pour la fonction MB_client :

  1. Mode = 1 pour l’écriture ;
  2. Adr_data = (1-1)+40001 , registre de maintien de l’eWON adresse 1 ;
  3. Longueur_data = 100, on écrit les 100 registres à partir de Adr_data soit 1 à 100.

Étape 210 = ⌛ attente de la fin de l’échange et enregistrement du résultat.

// ECRITURE PARTIE 1 : MESSAGE SMS A ENVOYER CARACTERE 1 à 100
IF "DB211_COM_EWON".G7_SEQ.NUM_ETAPE = 210 THEN

// attente fin de com
IF (NOT "DB211_COM_EWON".GEST_COM.Busy AND "DB211_COM_EWON".GEST_COM.Done)
OR ("DB211_COM_EWON".GEST_COM.Error) THEN
"DB211_COM_EWON".G7_SEQ.CMD1_0 := FALSE; // bit de seq pour lancement com

// pas d'erreur de com
IF NOT "DB211_COM_EWON".GEST_COM.Error THEN
"DB211_COM_EWON".G7_SEQ.CMD2_0 := False; // defaut de com de l'esclave

// vers etape suivante
"DB211_COM_EWON".G7_SEQ.T_100MS := 0;
"DB211_COM_EWON".G7_SEQ.T_1S := 0;
"DB211_COM_EWON".G7_SEQ.NUM_ETAPE := 220;

// erreur de com
ELSE
"DB211_COM_EWON".G7_SEQ.INT_1 := WORD_TO_INT("DB211_COM_EWON".GEST_COM.Status);
"DB211_COM_EWON".G7_SEQ.CMD2_0 := True; // defaut de com de l'esclave
// vers etape suivante
"DB211_COM_EWON".G7_SEQ.T_100MS := 0;
"DB211_COM_EWON".G7_SEQ.T_1S := 0;
"DB211_COM_EWON".G7_SEQ.NUM_ETAPE := 300;
END_IF;
END_IF;

END_IF;

Étape 220 = lancement de l’écriture des registres du message SMS envoyé par l’eWON. Écriture de la fin de message registre 101 à 160.

// ECRITURE PARTIE 1 : MESSAGE SMS A ENVOYER CARACTERE 101 à 160
IF "DB211_COM_EWON".G7_SEQ.NUM_ETAPE = 220 AND "DB211_COM_EWON".G7_SEQ.T_100MS >= 1 THEN

// preparation des données
FOR #int_i := 0 TO 59 DO
// Statement section FOR
"DB211_COM_EWON".GEST_COM.Tab_data[#int_i] := "DB211_COM_EWON".SMS_ENVOI[#int_i + 101];
END_FOR;

// ECRITURE REGISTRE EWON 101 à 160
"DB211_COM_EWON".GEST_COM.Mode := 1; // ecriture
"DB211_COM_EWON".GEST_COM.Adr_data := 40101; // (101-1) pour modbus + 40001
"DB211_COM_EWON".GEST_COM.Longueur_data := 60; // nombre

IF NOT "DB211_COM_EWON".GEST_COM.Busy THEN
"DB211_COM_EWON".G7_SEQ.CMD1_0 := TRUE; // bit de seq pour lancement com
"DB211_COM_EWON".G7_SEQ.CMD1_2 := FALSE; // bit de seq pour forcage deconnexion

"DB211_COM_EWON".G7_SEQ.T_1S := 0;
"DB211_COM_EWON".G7_SEQ.T_100MS := 0;
"DB211_COM_EWON".G7_SEQ.NUM_ETAPE := 230;
END_IF;
END_IF;

Attention : l’écriture Modbus est limitée à 123 registres consécutifs donc le message SMS de 160 registres doit être écrit en 2 fois.
Préparation du message à envoyer, on recopie le tableau de Char SMS_ENVOI dans le tableau de la fonction de communication.
Paramètres pour la fonction MB_client :

  1. Mode = 1 pour l’écriture ;
  2. Adr_data = (101-1)+40001 , registre de maintien de l’eWON adresse 101 ;
  3. Longueur_data = 60, on écrit les 60 registres à partir de Adr_data soit 101 à 160.

Étape 230 = ⌛ attente de la fin de l’échange et enregistrement du résultat.

// ECRITURE PARTIE 1 : MESSAGE SMS A ENVOYER  CARACTERE 101 à 160
IF "DB211_COM_EWON".G7_SEQ.NUM_ETAPE = 230 THEN

// attente fin de com
IF (NOT "DB211_COM_EWON".GEST_COM.Busy AND "DB211_COM_EWON".GEST_COM.Done)
OR ("DB211_COM_EWON".GEST_COM.Error) THEN
"DB211_COM_EWON".G7_SEQ.CMD1_0 := FALSE; // bit de seq pour lancement com

// pas d'erreur de com
IF NOT "DB211_COM_EWON".GEST_COM.Error THEN
"DB211_COM_EWON".G7_SEQ.CMD2_0 := False; // defaut de com de l'esclave

// vers etape suivante
"DB211_COM_EWON".G7_SEQ.T_100MS := 0;
"DB211_COM_EWON".G7_SEQ.T_1S := 0;
"DB211_COM_EWON".G7_SEQ.NUM_ETAPE := 240;

// erreur de com
ELSE
"DB211_COM_EWON".G7_SEQ.INT_1 := WORD_TO_INT("DB211_COM_EWON".GEST_COM.Status);
"DB211_COM_EWON".G7_SEQ.CMD2_0 := True; // defaut de com de l'esclave
// vers etape suivante
"DB211_COM_EWON".G7_SEQ.T_100MS := 0;
"DB211_COM_EWON".G7_SEQ.T_1S := 0;
"DB211_COM_EWON".G7_SEQ.NUM_ETAPE := 300;
END_IF;
END_IF;

END_IF;

Étape 240 = lancement de l’écriture des registres d’échange de l’eWON.

// ECRITURE PARTIE 2 : MOT d'ECHANGE
IF "DB211_COM_EWON".G7_SEQ.NUM_ETAPE = 240 AND "DB211_COM_EWON".G7_SEQ.T_100MS>=1 THEN

// preparation des données
"DB211_COM_EWON".GEST_COM.Tab_data[0]:="DB211_COM_EWON".DMDE_ENVOI;
"DB211_COM_EWON".GEST_COM.Tab_data[1]:="DB211_COM_EWON".MOT_VIE;
"CONV_DINT_1" := "DB211_COM_EWON".NUM_TEL;
"DB211_COM_EWON".GEST_COM.Tab_data[2] := "CONV_INT_2";
"DB211_COM_EWON".GEST_COM.Tab_data[3] := "CONV_INT_1";;
"DB211_COM_EWON".GEST_COM.Tab_data[4]:="DB211_COM_EWON".ACQ_MESS_RECU;
"DB211_COM_EWON".GEST_COM.Tab_data[5]:="DB211_COM_EWON".INT_E5;

// ECRITURE REGISTRE EWON 200 à 209
"DB211_COM_EWON".GEST_COM.Mode := 1; // lecture
"DB211_COM_EWON".GEST_COM.Adr_data := 40200; // (200-1) pour modbus + 40001
"DB211_COM_EWON".GEST_COM.Longueur_data := 10; // nombre

IF NOT "DB211_COM_EWON".GEST_COM.Busy THEN
"DB211_COM_EWON".G7_SEQ.CMD1_0 := TRUE; // bit de seq pour lancement com
"DB211_COM_EWON".G7_SEQ.CMD1_2 := FALSE; // bit de seq pour forcage deconnexion

"DB211_COM_EWON".G7_SEQ.T_1S := 0;
"DB211_COM_EWON".G7_SEQ.T_100MS := 0;
"DB211_COM_EWON".G7_SEQ.NUM_ETAPE := 250;
END_IF;
END_IF;

Préparation du message à envoyer, on recopie la variable d’échange du DB211 dans le tableau de la fonction de communication.
Paramètres pour la fonction MB_client :

  1. Mode = 1 pour l’écriture ;
  2. Adr_data = (200-1)+40001 , registre de maintien de l’eWON adresse 200 ;
  3. Longueur_data = 10, on écrit les 10 registres à partir de Adr_data soit 200 à 209.
Étape 250 = attente de la fin de l’échange et enregistrement du résultat.
// ECRITURE PARTIE 2 : MOT d'ECHANGE
IF "DB211_COM_EWON".G7_SEQ.NUM_ETAPE = 250 THEN

// attente fin de com
IF (NOT "DB211_COM_EWON".GEST_COM.Busy AND "DB211_COM_EWON".GEST_COM.Done)
OR ("DB211_COM_EWON".GEST_COM.Error) THEN
"DB211_COM_EWON".G7_SEQ.CMD1_0 := FALSE; // bit de seq pour lancement com

// pas d'erreur de com
IF NOT "DB211_COM_EWON".GEST_COM.Error THEN
"DB211_COM_EWON".G7_SEQ.CMD2_0 := False; // defaut de com de l'esclave

// vers etape suivante
"DB211_COM_EWON".G7_SEQ.T_100MS := 0;
"DB211_COM_EWON".G7_SEQ.T_1S := 0;
"DB211_COM_EWON".G7_SEQ.NUM_ETAPE := 300;

// erreur de com
ELSE
"DB211_COM_EWON".G7_SEQ.INT_1 := WORD_TO_INT("DB211_COM_EWON".GEST_COM.Status);
"DB211_COM_EWON".G7_SEQ.CMD2_0 := True; // defaut de com de l'esclave
// vers etape suivante
"DB211_COM_EWON".G7_SEQ.T_100MS := 0;
"DB211_COM_EWON".G7_SEQ.T_1S := 0;
"DB211_COM_EWON".G7_SEQ.NUM_ETAPE := 300;
END_IF;
END_IF;

END_IF;

Étape 300 rebouclage de la séquence :

// REBOUCLAGE
IF "DB211_COM_EWON".G7_SEQ.NUM_ETAPE = 300 AND "DB211_COM_EWON".G7_SEQ.T_100MS>=1 THEN

"DB211_COM_EWON".G7_SEQ.T_1S := 0;
"DB211_COM_EWON".G7_SEQ.T_100MS := 0;
"DB211_COM_EWON".G7_SEQ.NUM_ETAPE := 10;

END_IF;
END_FUNCTION // "FC211_SEQ_MODBUS_EWON"

6.2 Récapitulatif des registres d’échange

Attention : Ancienne version des registres Modbus de l’eWON.

Tag eWON Type Registre Modbus Sens Variable ET 200 SP Type Adresse
StatusEnvoi Entier 210 STATUS_ENVOI Int DB211.DBW 458
StatutMessageRecu Entier 211 STATUS_MESS_RECU Int DB211.DBW 460
Signal_GSM Entier 212 SIGNAL_GSM Int DB211.DBW 462
Réserve variables eWON INT_R4 Int DB211.DBW 464
INT_R5 Int DB211.DBW 466
INT_R6 Int DB211.DBW 468
INT_R7 Int DB211.DBW 470
INT_R8 Int DB211.DBW 472
INT_R9 Int DB211.DBW 474
INT_R10 Int DB211.DBW 476
MSG1001 à MSG1160 Entier 1101 à 1160 SMS_RECU Array[1..160] of Char DB211.DBW 478
DmdeEnvoi Entier 200 DMDE_ENVOI Int DB211.DBW 638
MotDeVie Entier 201 MOT_VIE Int DB211.DBW 640
NumeroSIM1 Entier 202 NUM_TEL DInt DB211.DBW 642
AcquitMessageRecu Entier 204 ACQ_MESS_RECU Int DB211.DBW 646
Réserve variables eWON INT_E5 Int DB211.DBW 648
INT_E6 Int DB211.DBW 650
INT_E7 Int DB211.DBW 652
INT_E8 Int DB211.DBW 654
INT_E9 Int DB211.DBW 656
INT_E10 Int DB211.DBW 658
MSG1 à MSG160 Entier 1 à 160 SMS_ENVOI Array[1..160] of Char DB211.DBW 660

6.3 Envoi et réception des SMS

Gestion de l’envoi et de la réception des SMS

6.3.1 Configuration de l’eWON

La configuration de l’eWON est identique à celle décrite dans la partie M340.

6.3.2 Configuration de l’ET 200 SP

La configuration est la même que le chapitre 6.1 Gestion de l’échange des registres.

6.3.3 Programme eWON

Le programme de l’eWON est identique à celle décrite dans la partie M340

6.3.4 DB FC 212 Gestion SMS eWON

Création du DB212_GEST_SMS_EWON pour :

  • La séquence d’envoi et de réception des SMS : G7_SEQ de type UDT_SEQ
  • L’enregistrement des messages SMS à envoyer.
DB212_GEST_SMS_EWON

Figure 56 : DB212_GEST_SMS_EWON

Création du FC212_SEQ_GEST_SMS_EWON pour la mise en œuvre de la communication Modbus-TCP avec l’eWON :
Remarque : cette séquence est identique à séquence du M340.
Appel du FC dans OB1
Étape 0 initialisation classique de la séquence :

  1. Init par afficheur. Ajouter BP ;
  2. RAZ des variables ;
  3. Démarrage ;
  4. Tempos
//INIT SEQUENCE PAR AFFICHEUR
IF "AlwaysFALSE" THEN
"DB212_GEST_SMS_EWON".G7_SEQ.NUM_ETAPE := 0;
END_IF;

//RAZ DES VARIABLES
IF "DB212_GEST_SMS_EWON".G7_SEQ.NUM_ETAPE = 0 THEN // ...
END_IF;

//DEMARRAGE DE LA SEQUENCE
IF "DB212_GEST_SMS_EWON".G7_SEQ.NUM_ETAPE = 0 AND "REPRISE_API_OK" THEN
"DB212_GEST_SMS_EWON".G7_SEQ.NUM_ETAPE := 10;
END_IF;

//INCREMENTATION TEMPO
IF "BIT_100ms" AND "DB212_GEST_SMS_EWON".G7_SEQ.T_100MS < 32766 THEN
"DB212_GEST_SMS_EWON".G7_SEQ.T_100MS := "DB212_GEST_SMS_EWON".G7_SEQ.T_100MS + 1;
END_IF;
IF "BIT_1s" AND "DB212_GEST_SMS_EWON".G7_SEQ.T_1S < 32766 THEN
"DB212_GEST_SMS_EWON".G7_SEQ.T_1S := "DB212_GEST_SMS_EWON".G7_SEQ.T_1S + 1;
END_IF;

Étape 10 attente ⌛

  1. Paramétrage de numéro de téléphone pour la réception des SMS ;
  2. Attente bit CMD1_0 ou CMD1_1 déclenchant l’envoi d’un SMS par un défaut par exemple ;
  3. Attente du mot d’échange STATUS_MESS_RECU = 1, indiquant la réception d’un SMS par l’eWON.
//ETAPE ATTENTE 
IF "DB212_GEST_SMS_EWON".G7_SEQ.NUM_ETAPE = 10 THEN

(*Numéro de telephone par la reception du SMS*)
"DB211_COM_EWON".NUM_TEL := 666925597;(*+33 + num_tel*)

(* demande envoi SMS 1 *)
IF "DB212_GEST_SMS_EWON".G7_SEQ.CMD1_0 THEN
"DB212_GEST_SMS_EWON".G7_SEQ.CMD1_0 := FALSE;

"DB212_GEST_SMS_EWON".MESS_ENVOI := "DB212_GEST_SMS_EWON".MESS_ENVOI_1;

"DB212_GEST_SMS_EWON".G7_SEQ.T_1S := 0;
"DB212_GEST_SMS_EWON".G7_SEQ.T_100MS := 0;
"DB212_GEST_SMS_EWON".G7_SEQ.NUM_ETAPE := 20;
END_IF;

(* demande envoi SMS 2 *)
IF "DB212_GEST_SMS_EWON".G7_SEQ.CMD1_1 THEN
"DB212_GEST_SMS_EWON".G7_SEQ.CMD1_1 := FALSE;

"DB212_GEST_SMS_EWON".MESS_ENVOI := "DB212_GEST_SMS_EWON".MESS_ENVOI_2;

"DB212_GEST_SMS_EWON".G7_SEQ.T_1S := 0;
"DB212_GEST_SMS_EWON".G7_SEQ.T_100MS := 0;
"DB212_GEST_SMS_EWON".G7_SEQ.NUM_ETAPE := 20;
END_IF;

(* attente recption SMS*)
IF "DB211_COM_EWON".STATUS_MESS_RECU = 1 THEN
"DB212_GEST_SMS_EWON".G7_SEQ.CMD1_0 := FALSE;

"DB212_GEST_SMS_EWON".G7_SEQ.T_1S := 0;
"DB212_GEST_SMS_EWON".G7_SEQ.T_100MS := 0;
"DB212_GEST_SMS_EWON".G7_SEQ.NUM_ETAPE := 100;
END_IF;
END_IF;

Étape 20 préparation du message
SMS à envoyer.
Le message de départ est de type String, il doit être transformé en tableau de Char pour être compatible avec la fonction de com.
Garder cette tempo, il permet d’être certain que les registre de l’eWON ont bien été mis à jour par la séquence de com.

IF "DB212_GEST_SMS_EWON".G7_SEQ.NUM_ETAPE = 20 THEN
//pour parametre ne peut pas etre adressage direct
#cnt := 160;
//init tableau d'envoi du SMs
FOR #int_i := 1 TO 160 DO
// Statement section FOR
"DB211_COM_EWON".SMS_ENVOI[#int_i]:=' ';
END_FOR;

//transformer chaine de caratere en tableau de caractere pour l'envoi vers l'ewon
Strg_TO_Chars(Strg:="DB212_GEST_SMS_EWON".MESS_ENVOI,
pChars:=0,
Cnt=>#cnt,
Chars:="DB211_COM_EWON".SMS_ENVOI);

(*Tempo pour laisser a la com le temps de mettre a jour les registres de l'ewon*)
IF "DB212_GEST_SMS_EWON".G7_SEQ.T_1S >= 5 THEN
"DB211_COM_EWON".DMDE_ENVOI := 0;(* envoi vers Ewon demande envoi SMS*)
"DB212_GEST_SMS_EWON".G7_SEQ.T_100MS := 0;
"DB212_GEST_SMS_EWON".G7_SEQ.T_1S := 0;
"DB212_GEST_SMS_EWON".G7_SEQ.NUM_ETAPE := 30;
END_IF;

END_IF;

Étape 30 demande d’envoi du SMS

  1. Demande d’envoi du SMS ;
  2. Attente confirmation de l’eWON de la prise en compte de l’envoi du SMS.
IF "DB212_GEST_SMS_EWON".G7_SEQ.NUM_ETAPE = 30 THEN

"DB211_COM_EWON".DMDE_ENVOI := 1;(* envoi vers Ewon demande envoi SMS*)

(*MESSAGE EN COURS DE TRAITEMENT*)
IF "DB211_COM_EWON".STATUS_ENVOI = 0 THEN
"DB211_COM_EWON".DMDE_ENVOI := 0;(* envoi vers Ewon demande envoi SMS*)
"DB212_GEST_SMS_EWON".G7_SEQ.T_100MS := 0;
"DB212_GEST_SMS_EWON".G7_SEQ.T_1S := 0;
"DB212_GEST_SMS_EWON".G7_SEQ.NUM_ETAPE := 40;
END_IF;

END_IF;

Étape 40 résultat d’envoi du SMS

  1. SMS correctement envoyé ;
  2. Rebouclage vers attente = 10 ;
  3. SMS non envoyé ;
  4. Rebouclage vers attente = 10.
IF "DB212_GEST_SMS_EWON".G7_SEQ.NUM_ETAPE = 40 THEN

(*SMS correctement envoyé*)
IF "DB211_COM_EWON".STATUS_ENVOI = 2 THEN
"DB212_GEST_SMS_EWON".G7_SEQ.T_100MS := 0;
"DB212_GEST_SMS_EWON".G7_SEQ.T_1S := 0;
"DB212_GEST_SMS_EWON".G7_SEQ.NUM_ETAPE := 10;
END_IF;

(*Probleme d'envoi du SMS *)
IF "DB211_COM_EWON".STATUS_ENVOI = 3 THEN
"DB212_GEST_SMS_EWON".G7_SEQ.T_100MS := 0;
"DB212_GEST_SMS_EWON".G7_SEQ.T_1S := 0;
"DB212_GEST_SMS_EWON".G7_SEQ.NUM_ETAPE := 10;
END_IF;
END_IF;

Étape 100 récupération du SMS

  1. Garder cette tempo, il permet d’être certain que les registres de l’eWON ont bien été mis à jour par la séquence de com ;
  2. Le message reçu est de type tableau de Char, il doit être transformé en String pour être compatible.
IF "DB212_GEST_SMS_EWON".G7_SEQ.NUM_ETAPE = 100 THEN

(*Tempo pour attente recpetion par modbus du message*)
IF "DB212_GEST_SMS_EWON".G7_SEQ.T_1S >= 5 THEN

(*pour reconstitution en chaine de caractere avec 1 int = 2 caracteres*)
Chars_TO_Strg(Chars := "DB211_COM_EWON".SMS_RECU,
pChars := 0,
Cnt := #cnt,
Strg => "DB212_GEST_SMS_EWON".MESS_RECU);

"DB212_GEST_SMS_EWON".G7_SEQ.T_100MS := 0;
"DB212_GEST_SMS_EWON".G7_SEQ.T_1S := 0;
"DB212_GEST_SMS_EWON".G7_SEQ.NUM_ETAPE := 110;
END_IF;

END_IF;

Étape 110 acquitter réception du SMS

  1. Demande d’acquittement du SMS ;
  2. Attente⌛ confirmation de l’eWON de la prise en compte de l’acquittement du SMS.
IF "DB212_GEST_SMS_EWON".G7_SEQ.NUM_ETAPE = 110 THEN

"DB211_COM_EWON".ACQ_MESS_RECU := 1;(* envoi vers Ewon acquit reception SMS*)

(*MESSAGE ACQUITTER*)
IF "DB211_COM_EWON".STATUS_MESS_RECU = 0 THEN
"DB211_COM_EWON".DMDE_ENVOI := 0;(* envoi vers Ewon demande envoi SMS*)
"DB212_GEST_SMS_EWON".G7_SEQ.T_100MS := 0;
"DB212_GEST_SMS_EWON".G7_SEQ.T_1S := 0;
"DB212_GEST_SMS_EWON".G7_SEQ.NUM_ETAPE := 120;
END_IF;

END_IF;

Étape 120 fin réception du SMS
Fin d’acquittement du SMS.
Rebouclage vers attente = 10

IF "DB212_GEST_SMS_EWON".G7_SEQ.NUM_ETAPE = 120 THEN

"DB211_COM_EWON".ACQ_MESS_RECU := 0;(* envoi vers Ewon acquit reception SMS*)

(*Tempo*)
IF "DB212_GEST_SMS_EWON".G7_SEQ.T_1S >= 0 THEN
"DB212_GEST_SMS_EWON".G7_SEQ.T_100MS := 0;
"DB212_GEST_SMS_EWON".G7_SEQ.T_1S := 0;
"DB212_GEST_SMS_EWON".G7_SEQ.NUM_ETAPE := 10;
END_IF;

END_IF;

Numéro de message ligne 296 à la fin ligne 300
Particularité :
Paramétrage des différents messages SMS à envoyer.

//------------- MESSAGE SMS ------------
(*Message du SMS*)
"DB212_GEST_SMS_EWON".MESS_ENVOI_1 := 'MESSAGE NUMERO 1';
"DB212_GEST_SMS_EWON".MESS_ENVOI_2 := 'MESSAGE NUMERO 2';